Agoric ve Hardened JavaScript'e Giriş
Agoric, akıllı sözleşmelerin geliştirilmesi ve çalıştırılması için bir platformdur. Bu platform, JavaScript dilini kullanarak programlama yapmanızı sağlar. Ayrıca, Agoric mimarisi, çözümleme katmanı ve SwingSet yürütme sistemi gibi bileşenleri içerir. Bu bileşenler, akıllı sözleşmelerin güvenliğini artırmak ve performansını optimize etmek için tasarlanmıştır.
Hardened JavaScript, normal JavaScript'ten daha güvenli bir versiyonudur. Bu özelliklere sahip olmak için, dilin belirli özellikleri kısıtlanır veya değiştirilir. Örneğin, fonksiyonların sadece belli bir yere kadar çalışmasına izin verilir ve erişim kontrolü mekanizmaları kullanılır. Böylece, kötü niyetli kişilerin kodunuzu güvenlik açıklarından faydalanarak hacklemesi engellenir.
Agoric ve Hardened JavaScript arasındaki bağlantı, Agoric platformunun akıllı sözleşmelerinin yazılmasında kullanılmasıdır. Bu nedenle, Agoric Bootcamp derslerinde öğrencilere Hardened JavaScript'in temelleri öğretilir. Bu sayede, öğrenciler bu dilin avantajlarını kullanarak Agoric platformunda güvenli akıllı sözleşmeler yazabilirler.
Diyelim ki bir akıllı sözleşme yazmak istiyorsunuz ve bu sözleşmenin işlevi, bir varlık transferi gerçekleştirmektir. Bu sözleşmenin özellikle güvenli olması gereklidir çünkü birçok farklı kullanıcı tarafından etkileşimde bulunulacak ve fonların doğru şekilde transfer edilmesi önemlidir.
Bu durumda, Agoric platformu kullanarak bu akıllı sözleşmeyi yazabilirsiniz. Ancak, normal JavaScript kullanmak yerine Hardened JavaScript kullanmanız daha güvenli olacaktır. Örneğin, Hardened JavaScript yoluyla, kodunuzu kısıtlayabilir ve sadece belirli işlemler yapmasına izin verebilirsiniz. Bunun yanı sıra, Hardened JavaScript, zamansal saldırılardan da koruma sağlar ve erişim kontrolü mekanizmaları kullanır.
import harden from '@agoric/harden';
const hello = harden({
greet: () => {
console.log('Merhaba Dünya!');
}
});
hello.greet();
Bu kodda import harden from '@agoric/harden';
ile harden fonksiyonu çekilir ve sonra const değişkeni hello tanımlanır. Fonksiyon içinde console.log()
kullanarak "Merhaba Dünya!" yazdırılır. Son olarak da, hello değişkeninin greet()
metodu çağrılır ve sonuç olarak konsol ekranına "Merhaba Dünya!" yazısı yazdırılır.
Bu örnek, Hardened JavaScript ile normal JavaScript arasındaki farkı göstermek için oldukça basit bir örnektir. harden()
fonksiyonu, "hello" objesini sınırlı hale getirir ve onu değiştirilmez yapar. Bu sayede, kötü niyetli bir saldırganın kodu ele geçirmesi durumunda, hello
objesi korunur ve değiştirilemez hale getirilir.
Remote Object Communication
Uzaktan nesne iletişimi (Remote Object Communication), objelerin birbirleriyle etkileşim kurması için kullanılan bir mekanizmadır. Bu mekanizma sayesinde, objeler birbirleriyle fonksiyon çağırmaları yapabilir veya veri paylaşabilirler. Agoric platformunda, uzaktan nesne iletişimi, Hardened JavaScript ile birlikte kullanılır.
Hardened JavaScript içinde, her obje bir kimliğe sahiptir. Bu kimlik, objenin bir diğer obje tarafından çağırılabilmesini sağlar. Agoric platformunda, bu kimlikler "hizmet kimlikleri" olarak adlandırılır. Her bir hizmet kimliği, bir objeyi temsil eder ve diğer objelerin ona erişmesine izin verir.
Uzaktan nesne iletişimi, hizmet kimliklerinin kullanımına dayanır. Bir obje, diğer bir objeye hizmet kimliği gönderebilir. Diğer obje, bu kimlik üzerinden orijinal objeye erişebilir ve fonksiyon çağırabilir veya veri paylaşabilir.
Örneğin, iki akıllı sözleşme arasında uzaktan nesne iletişimi kullanarak veri paylaşımı yapmak istiyorsunuz. İlk olarak, her bir sözleşmenin kendine özgü bir hizmet kimliği olması gerekiyor. Daha sonra, her bir sözleşme, diğerinin hizmet kimliğini alır ve ona erişir.
Agoric platformunda, uzaktan nesne iletişimi, Hardened JavaScript'in güvenlik özellikleri ile birlikte kullanılır. Bu sayede, objelerin yalnızca belirli işlemleri yapmalarına izin verilir ve kötü niyetli saldırganların manipülasyonuna karşı korunurlar.
Sonuç olarak, uzaktan nesne iletişimi, Agoric platformunda objeler arasında nasıl etkileşim kurulduğunu gösterir ve Hardened JavaScript ile birlikte kullanılarak objelerin güvenli bir şekilde paylaşılmasını sağlar.
Bu konuda bir örnek verelim. Aşağıdaki örnekte içinde iki akıllı sözleşme arasında hizmet kimlikleri kullanılarak veri paylaşımı yapılıyor.
İlk olarak, bir akıllı sözleşmede bir obje tanımlıyoruz ve ona bir hizmet kimliği atıyoruz.
import harden from "@agoric/harden";
const obj1 = harden({
data: "Hello World!"
});
export const makeContract = () => {
return harden({
getObj1Service: () => {
return {
getService: () => {
return obj1;
}
};
}
});
};
Bu sözleşmenin makeContract()
fonksiyonu, getObj1Service()
adlı bir metot içerir. Bu metot, getService()
fonksiyonunu döndürür. getService()
fonksiyonu, obj1
adlı objeyi döndürür ve diğer akıllı sözleşmelerin bu objeye erişim sağlamasını sağlar.
İkinci akıllı sözleşmede, ilk akıllı sözleşmeden gelen hizmet kimliği kullanılarak veri alınır.
import { Far } from "@agoric/marshal";
export const makeContract = (myService) => {
const obj1Service = myService.getObj1Service().getService();
const obj2 = Far("obj2", {
displayData: () => {
console.log(obj1Service.data);
}
});
return harden({
getObj2Service: () => {
return Far("obj2Service", {
getService: () => {
return obj2;
}
});
}
});
};
Bu sözleşmenin makeContract()
fonksiyonu, getObj2Service()
adlı bir metot içerir. Bu metot, getService()
fonksiyonunu döndürür. getService()
fonksiyonu ise, obj2
adlı objeyi döndürür ve diğer akıllı sözleşmelerin bu objeye erişim sağlamasını sağlar. obj2
objesi, displayData()
adlı bir fonksiyon içerir ve bu fonksiyon, obj1Service
üzerinden data
değişkenini konsol ekranına yazdırır.
Yukarıdaki örnekte, obj1Service
ve obj2Service
hizmet kimlikleri aracılığıyla veri paylaşımı yapılır. İlk akıllı sözleşmede tanımlanan obj1
adlı obje, ikinci akıllı sözleşmede kullanılabilir hale getirilir. Bu sayede, akıllı sözleşmeler arasında veri paylaşımı yapmak mümkün olur.